/**
 * @file app_button.h
 * @brief 按键驱动头文件
 * @details
 *   按键配置:
 *   - PB13: "忽略1"按键 (忽略UV工作时间超过15000小时警告)
 *   - PB14: "忽略2"按键 (忽略UV辐射度不足警告)
 *   - PC3:  "更换成功"按键 (更换UV灯后清除EEPROM数据)
 *
 *   触发方式: 下降沿中断 + 50ms软件防抖
 *
 * @date 2025-11-17
 */

#ifndef __APP_BUTTON_H
#define __APP_BUTTON_H

#include "stm32f10x.h"

// 按键GPIO定义
#define BUTTON_IGNORE1_GPIO_RCC     RCC_APB2Periph_GPIOB
#define BUTTON_IGNORE1_GPIO_PORT    GPIOB
#define BUTTON_IGNORE1_GPIO_PIN     GPIO_Pin_13
#define BUTTON_IGNORE1_EXTI_LINE    EXTI_Line13
#define BUTTON_IGNORE1_EXTI_IRQn    EXTI15_10_IRQn

#define BUTTON_IGNORE2_GPIO_RCC     RCC_APB2Periph_GPIOB
#define BUTTON_IGNORE2_GPIO_PORT    GPIOB
#define BUTTON_IGNORE2_GPIO_PIN     GPIO_Pin_14
#define BUTTON_IGNORE2_EXTI_LINE    EXTI_Line14
#define BUTTON_IGNORE2_EXTI_IRQn    EXTI15_10_IRQn

#define BUTTON_REPLACE_GPIO_RCC     RCC_APB2Periph_GPIOC
#define BUTTON_REPLACE_GPIO_PORT    GPIOC
#define BUTTON_REPLACE_GPIO_PIN     GPIO_Pin_3
#define BUTTON_REPLACE_EXTI_LINE    EXTI_Line3
#define BUTTON_REPLACE_EXTI_IRQn    EXTI3_IRQn

// 防抖延时时间(ms)
#define BUTTON_DEBOUNCE_TIME_MS     50

/**
 * @brief 按键初始化
 * @param  无
 * @return 无
 * @note   初始化PB13/PB14/PC3为下降沿中断,配置NVIC
 */
void app_button_init(void);

/**
 * @brief 读取"忽略1"按键状态
 * @param  无
 * @return uint8_t 1=按下, 0=未按下
 * @note   读取后自动清除标志位
 */
uint8_t app_button_get_ignore1(void);

/**
 * @brief 读取"忽略2"按键状态
 * @param  无
 * @return uint8_t 1=按下, 0=未按下
 * @note   读取后自动清除标志位
 */
uint8_t app_button_get_ignore2(void);

/**
 * @brief 读取"更换成功"按键状态
 * @param  无
 * @return uint8_t 1=按下, 0=未按下
 * @note   读取后自动清除标志位
 */
uint8_t app_button_get_replace(void);

/**
 * @brief 按键扫描任务(100ms调用一次)
 * @param  无
 * @return 无
 * @note   处理按键防抖和标志位设置
 */
void app_button_scan(void);

#endif /* __APP_BUTTON_H */
